class Left { // left 函子作为错误处理的方式 返回保存了错误日子的函子
  static of(val) { return new Left(val); }
  constructor(val) { this._val = val; }
  map(fn) {
    return this; // 返回本身 以为记录错误 本身就是出错的error信息
  }
}

class Right { // right函子是正确处理用的函子
  static of(val) { return new Right(val); }
  constructor(val) { this._val = val; }
  map(fn) {
    return Right.of(fn(this._val));
  }
}

// 在parseJson这个方法中 如果正确处理了 会返回rigth函子
// 如果出错 返回left函子
function parseJson(str) {
  try {
    return Right.of(JSON.parse(str));
  } catch (e) {
    return Left.of({ error: e.message });
  }
}

const r = parseJson('{"name": "lp"}');
console.log(r);